home *** CD-ROM | disk | FTP | other *** search
- unit BigStrings;
-
- { This unit allows the creation and use of strings that are larger than 255 characters. }
- { Typical Pascal strings have a 'length' byte at position 0 in the 256 character array. }
- { These strings have two length bytes (for a max length of 65536 characters) but are }
- { typically less. }
-
- interface
-
- const
- kBigStringMaxLength = 4096;
-
- type
- BigString = record
- length: Integer;
- chr: packed array[1..kBigStringMaxLength] of char;
- end;
- BigStringPtr = ^BigString;
-
- { Similarities with Strings: }
- { 1) Null string: }
- { s := ''; b.length := 0; }
-
- { Create/dispose of a new BigString on the heap }
- function NewBigStringPtr: BigStringPtr;
- procedure DisposeBigStringPtr(var b: BigStringPtr);
-
- { Convert a string into a big string and conversely }
- procedure StrToBigString(s: String; var b: BigStringPtr);
- procedure BigStringToStr(b: BigStringPtr; var s: String);
-
- { Add a string to a big string }
- procedure BigStrConcat(var b: BigStringPtr; s: String);
- { Add a big string to a big string }
- procedure BigConcat(var b: BigStringPtr; c: BigStringPtr);
-
- { Check if a string is equal to a big string }
- function BigStrEqual(b: BigStringPtr; s: String): Boolean;
-
- implementation
-
- uses
- Types, Memory;
-
- function NewBigStringPtr: BigStringPtr;
- var
- b: BigStringPtr;
- begin
- b := BigStringPtr(NewPtrClear(SizeOf(BigString)));
- if (b <> nil) then
- b^.length := 0;
- NewBigStringPtr := b;
- end; { NewBigStringPtr }
-
- procedure DisposeBigStringPtr(var b: BigStringPtr);
- begin
- DisposePtr(Ptr(b));
- end; { DisposeBigStringPtr }
-
- procedure StrToBigString(s: String; var b: BigStringPtr);
- var
- i, l: Integer;
- begin
- if b <> nil then begin
- l := Length(s);
- if l > 0 then
- for i := 1 to l do
- b^.chr[i] := s[i];
- b^.length := l;
- end; { if b }
- end; { StrToBigString }
-
- procedure BigStringToStr(b: BigStringPtr; var s: String);
- var
- i, l: Integer;
- begin
- if b <> nil then begin
- l := b^.length;
- if l > 0 then begin
- if l > 255 then
- l := 255;
- for i := 1 to l do
- s[i] := b^.chr[i];
- {$push}
- {$r-}
- s[0] := Chr(l);
- {$pop}
- end;
- end; { if b }
- end; { BigStringToStr }
-
-
- procedure BigStrConcat(var b: BigStringPtr; s: String);
- var
- i, l: Integer;
- begin
- if b <> nil then begin
- l := Length(s);
- if l > 0 then begin
- if (b^.length + l) > kBigStringMaxLength then
- l := kBigStringMaxLength - b^.length;
- for i := 1 to l do
- b^.chr[b^.length + i] := s[i];
- b^.length := b^.length + l;
- end; { if l > 0 }
- end; { if b }
- end; { BigStrConcat }
-
- procedure BigConcat(var b: BigStringPtr; c: BigStringPtr);
- var
- i, l: Integer;
- begin
- if b <> nil then begin
- l := c^.length;
- if l > 0 then begin
- if (b^.length + l) > kBigStringMaxLength then
- l := kBigStringMaxLength - b^.length;
- for i := 1 to l do
- b^.chr[b^.length + i] := c^.chr[i];
- b^.length := b^.length + l;
- end; { if l > 0 }
- end; { if b }
- end; { BigConcat }
-
- function BigStrEqual(b: BigStringPtr; s: String): Boolean;
- var
- result, match: Boolean;
- i, l: Integer;
- begin
- result := false;
- l := Length(s);
- if (l = b^.length) then begin
- match := true;
- i := 1;
- while match do begin
- match := s[i] = b^.chr[i];
- if match then
- i := i + 1;
- if i > l then
- match := false; { to leave the while loop }
- end; { while }
-
- if i > l then
- result := true; { we have a match! }
- end;
- BigStrEqual := result;
- end; { BigStrEqual }
-
- end. { BigStrings }